package com.keitaitoys.fonteditor.io;

import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Arrays;
import java.util.Set;

import javax.swing.filechooser.FileFilter;

import com.keitaitoys.fonteditor.font.Symbol;
import com.keitaitoys.fonteditor.font.Font;
import com.keitaitoys.util.TXTFileFilter;

public class TXTFontExporter implements FontExporter {

	//////////////////////////////////////////////////////////////////////
	// Description ///////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	//////////////////////////////////////////////////////////////////////
	// Consts ////////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	private static final String[] formatNames = {
		"txt"
	};
	
	//////////////////////////////////////////////////////////////////////
	// Variables /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	private final FileFilter fileFilter;
	
	//////////////////////////////////////////////////////////////////////
	// Constructor ///////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////

	public TXTFontExporter() {
		
		fileFilter = new TXTFileFilter();
	}
	
	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////
	
	public String[] getFormatNames() {
		
		return (String[])formatNames.clone();
	}
	
	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////
	
	public FileFilter getFileFilter() {
		
		return fileFilter;
	}

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////
	
	public void export(String path, Font font) throws FontExportFailedException {
		
		export(new File(path), font);
	}

	//////////////////////////////////////////////////////////////////////
	// Functions /////////////////////////////////////////////////////////
	//////////////////////////////////////////////////////////////////////
	
	public void export(File file, Font font) throws FontExportFailedException {
		
		Writer writer = null;

		try {
			
			Set<Symbol> symbols = font.getSymbols();
			Object[] sortedSymbols = symbols.toArray();
			Arrays.sort(sortedSymbols);

			StringBuffer stringBuffer = new StringBuffer();

			for(Object object : sortedSymbols) {
				stringBuffer.append(((Symbol)object).getChar());
			}

			writer = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file), "UTF-8"));
			writer.write(stringBuffer.toString());

		} catch(Exception e) {

			throw new FontExportFailedException(e);
			
		} finally {
			
			if(writer != null) {
				
				try {
					writer.close();
				} catch(IOException e) {
					e.printStackTrace();
				}
			}
		}
	}
}
